Error Handling Functions (এরর হ্যান্ডলিং ফাংশনস)

Computer Programming - সি স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্স (C Standard Library Reference)
227
227

Error Handling Functions (এরর হ্যান্ডলিং ফাংশনস)

সি প্রোগ্রামিং ভাষায় এরর হ্যান্ডলিং ফাংশন ব্যবহার করে প্রোগ্রাম চলাকালীন কোনো সমস্যা বা ত্রুটি (error) শনাক্ত করা এবং সেগুলো পরিচালনা করা যায়। এরর হ্যান্ডলিং ফাংশনগুলো প্রোগ্রামের স্থিতিশীলতা এবং ত্রুটিপূর্ণ অবস্থা থেকে পুনরুদ্ধারে সহায়ক। এই ফাংশনগুলো সাধারণত errno.h এবং stdlib.h হেডার ফাইলের অন্তর্গত।

নিচে সি প্রোগ্রামিংয়ের গুরুত্বপূর্ণ কিছু এরর হ্যান্ডলিং ফাংশন এবং ম্যাক্রো সম্পর্কে আলোচনা করা হলো।


১. perror() – এররের বর্ণনা প্রদর্শন

perror() ফাংশনটি সর্বশেষ ঘটে যাওয়া ত্রুটির (error) জন্য একটি বার্তা প্রদর্শন করে। এটি সাধারণত errno ভেরিয়েবলের মান অনুযায়ী এররের বর্ণনা দেখায়।

সিঙ্কট্যাক্স:

void perror(const char *message);

উদাহরণ:

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");

    if (file == NULL) {
        perror("Error opening file");
    }

    return 0;
}

Output:
Error opening file: No such file or directory


২. strerror() – এররের স্ট্রিং বার্তা প্রদান

strerror() ফাংশনটি errno কোডের উপর ভিত্তি করে একটি স্ট্রিং বার্তা প্রদান করে। এটি errno ভেরিয়েবলের মান অনুসারে এররের বর্ণনা রিটার্ন করে।

সিঙ্কট্যাক্স:

char *strerror(int errnum);

উদাহরণ:

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");

    if (file == NULL) {
        printf("Error: %s\n", strerror(errno));
    }

    return 0;
}

Output:
Error: No such file or directory


৩. errno – এরর নম্বর ভেরিয়েবল

errno একটি গ্লোবাল ইন্টিজার ভেরিয়েবল যা সর্বশেষ ঘটে যাওয়া ত্রুটির কোড সংরক্ষণ করে। যখন একটি ত্রুটি ঘটে, তখন errno ভেরিয়েবলে নির্দিষ্ট একটি মান সংরক্ষিত হয়, যা errno.h হেডার ফাইল থেকে ব্যবহার করা যায়।

উদাহরণ:

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");

    if (file == NULL) {
        printf("Error code: %d\n", errno);
    }

    return 0;
}

Output:
Error code: 2 (এই কোডটি নির্দিষ্ট এরর ম্যাসেজের প্রতিনিধিত্ব করে, যেমন "No such file or directory")


৪. exit() – প্রোগ্রাম থেকে বেরিয়ে যাওয়া

exit() ফাংশনটি প্রোগ্রাম থেকে নির্দিষ্ট স্ট্যাটাস কোড সহ বেরিয়ে যেতে ব্যবহৃত হয়। এটি একটি EXIT_SUCCESS বা EXIT_FAILURE কোড সহ প্রোগ্রাম থেকে বের হতে সাহায্য করে।

সিঙ্কট্যাক্স:

void exit(int status);
  • EXIT_SUCCESS – সফলভাবে প্রোগ্রাম শেষ হয়েছে।
  • EXIT_FAILURE – প্রোগ্রাম ত্রুটিপূর্ণভাবে শেষ হয়েছে।

উদাহরণ:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("File not found.\n");
        exit(EXIT_FAILURE);
    } else {
        printf("File opened successfully.\n");
        fclose(file);
    }

    exit(EXIT_SUCCESS);
}

৫. setjmp() এবং longjmp() – এরর পুনরুদ্ধারের জন্য জাম্পিং

setjmp() এবং longjmp() ফাংশনগুলো প্রোগ্রামের এক অংশ থেকে অন্য অংশে লাফানোর জন্য ব্যবহৃত হয়। এগুলো সাধারণত এরর পুনরুদ্ধারের জন্য ব্যবহৃত হয়, যেখানে setjmp() বর্তমান অবস্থান সংরক্ষণ করে এবং longjmp() সংরক্ষিত অবস্থানে ফিরে আসে।

সিঙ্কট্যাক্স:

int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);

উদাহরণ:

#include <stdio.h>
#include <setjmp.h>

jmp_buf buffer;

void testFunction() {
    printf("Inside testFunction\n");
    longjmp(buffer, 1);  // setjmp এর অবস্থানে ফিরে যায়
}

int main() {
    if (setjmp(buffer)) {
        printf("Back to main function\n");
    } else {
        printf("Calling testFunction\n");
        testFunction();
    }

    return 0;
}

Output:

Calling testFunction  
Inside testFunction  
Back to main function  

গুরুত্বপূর্ণ errno কোডসমূহ

errno কোডবর্ণনা
EACCESঅনুমতি নেই
EBADFঅবৈধ ফাইল ডেসক্রিপ্টর
ENOMEMমেমোরি বরাদ্দের জন্য পর্যাপ্ত স্থান নেই
EFAULTঅবৈধ মেমোরি অ্যাক্সেস
EINVALঅবৈধ আর্গুমেন্ট
EIOইনপুট/আউটপুট ত্রুটি
ENOENTফাইল বা ডিরেক্টরি খুঁজে পাওয়া যায়নি
EPERMঅপারেশন করার অনুমতি নেই

সারসংক্ষেপ

ফাংশনকাজ
perror()সর্বশেষ ঘটে যাওয়া ত্রুটির বার্তা প্রদর্শন করে
strerror()নির্দিষ্ট errno কোডের স্ট্রিং বার্তা প্রদান করে
errnoসর্বশেষ ঘটে যাওয়া ত্রুটির কোড সংরক্ষণ করে
exit()প্রোগ্রাম থেকে নির্দিষ্ট স্ট্যাটাস কোড সহ বেরিয়ে যায়
setjmp()বর্তমান অবস্থান সংরক্ষণ করে
longjmp()setjmp() দ্বারা সংরক্ষিত অবস্থানে ফিরে আসে

সি প্রোগ্রামে এরর হ্যান্ডলিং ফাংশনগুলো ব্যবহারের মাধ্যমে ত্রুটি পরিচালনা করা সহজ হয় এবং প্রোগ্রামের স্থিতিশীলতা ও কার্যকারিতা বৃদ্ধি পায়। errno, perror(), strerror() এবং exit() এরর হ্যান্ডলিংয়ের জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে।

common.content_added_by

errno.h এর ধারণা এবং এর প্রয়োজনীয়তা

197
197

errno.h এর ধারণা এবং এর প্রয়োজনীয়তা

errno.h হেডার ফাইলটি সি প্রোগ্রামিং ভাষায় ত্রুটি নির্দেশক (error handling) ব্যবস্থাপনার জন্য ব্যবহৃত হয়। এটি ত্রুটি ঘটলে, সেই ত্রুটির কোড (error code) বা সংখ্যাগত মানকে ধরে রাখে, যা ত্রুটির ধরন সম্পর্কে তথ্য প্রদান করে। যখন একটি ফাংশন সফলভাবে কাজ করতে ব্যর্থ হয়, তখন errno ভেরিয়েবলে একটি নির্দিষ্ট ত্রুটি কোড সেট করা হয়। প্রোগ্রামাররা এই কোড চেক করে নির্ধারণ করতে পারেন ত্রুটির প্রকৃতি কী এবং সেই অনুযায়ী প্রয়োজনীয় পদক্ষেপ নিতে পারেন।


errno.h এর প্রয়োজনীয়তা

১. ত্রুটি পরিচালনা সহজ করে: errno.h এর মাধ্যমে ত্রুটি চিহ্নিত ও ব্যাখ্যা করা সহজ হয়। প্রোগ্রামিংয়ে অনেক ফাংশন (যেমন fopen(), malloc(), ইত্যাদি) যখন নির্দিষ্ট কারণে সফলভাবে কাজ করতে ব্যর্থ হয়, তখন errno ব্যবহার করে ত্রুটির কারণ নির্ধারণ করা সম্ভব।

২. ডিবাগিং সহজ করে: ত্রুটির কোড দেখিয়ে errno.h প্রোগ্রাম ডিবাগ করার ক্ষেত্রে সহায়ক হয়। কোডের কোথায় কোন ত্রুটি ঘটেছে এবং তার কারণ কী, তা দ্রুত নির্ধারণ করা যায়।

৩. উন্নত ব্যবহারকারীর প্রতিক্রিয়া: ত্রুটির ধরন অনুযায়ী ব্যবহারকারীকে উপযুক্ত বার্তা দেখানো যায়। যেমন, ফাইল না পাওয়া গেলে "File not found" বার্তা দেখানো যেতে পারে।


errno এর সাধারণ ব্যবহৃত ত্রুটি কোডসমূহ

errno.h এ কিছু পূর্বনির্ধারিত ত্রুটি কোড রয়েছে, যা বিভিন্ন ধরনের ত্রুটি নির্দেশ করে। নিচে কিছু সাধারণ ত্রুটি কোডের তালিকা এবং তাদের ব্যাখ্যা দেওয়া হলো:

ত্রুটি কোডঅর্থব্যাখ্যা
EACCESPermission deniedফাইলে অ্যাক্সেস করার অনুমতি নেই
ENOENTNo such file or directoryনির্দিষ্ট ফাইল বা ডিরেক্টরি পাওয়া যায়নি
ENOMEMOut of memoryপর্যাপ্ত মেমোরি নেই
EIOInput/output errorইনপুট/আউটপুট অপারেশনে ত্রুটি
EBADFBad file descriptorঅবৈধ ফাইল ডেসক্রিপ্টর
EINVALInvalid argumentঅবৈধ আর্গুমেন্ট দেওয়া হয়েছে
ERANGEResult too largeফলাফল অত্যন্ত বড় এবং এটি ব্যবহারের সীমা ছাড়িয়ে গেছে
EPERMOperation not permittedঅননুমোদিত অপারেশন
EAGAINResource temporarily unavailableঅস্থায়ীভাবে রিসোর্স পাওয়া যাচ্ছে না

errno এর ব্যবহার

errno হলো একটি গ্লোবাল ইন্টিজার ভেরিয়েবল যা ত্রুটি কোড সংরক্ষণ করে। যখন কোনো ফাংশন ত্রুটি ঘটায়, তখন errno ত্রুটির ধরন নির্ধারণ করতে সহায়ক হয়। errno চেক করতে errno.h হেডার ফাইলটি ইনক্লুড করতে হয় এবং ত্রুটি কোড ব্যাখ্যা করার জন্য strerror() ফাংশন ব্যবহার করা যেতে পারে।

উদাহরণ: fopen() ফাংশনে errno এর ব্যবহার

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file;

    // "nonexistent.txt" নামের ফাইলটি খোলার চেষ্টা
    file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
        return 1;
    }

    fclose(file);
    return 0;
}

এখানে, যদি "nonexistent.txt" ফাইলটি বিদ্যমান না থাকে, তবে errno তে ENOENT ত্রুটি কোড সেট করা হবে, এবং strerror() এর মাধ্যমে ত্রুটির বিবরণ দেখানো হবে: **"No such file or directory"**।


strerror() ফাংশন

strerror() ফাংশনটি errno ত্রুটি কোডকে একটি ব্যাখ্যামূলক স্ট্রিংয়ে রূপান্তর করে। এটি ত্রুটির সংখ্যা অনুযায়ী একটি ব্যাখ্যামূলক বার্তা প্রদান করে, যা ডিবাগিং এবং ত্রুটি সংশোধনে সহায়ক।

সিঙ্কট্যাক্স:

char *strerror(int errnum);

উদাহরণ:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    errno = EACCES;  // অনুমতি সংক্রান্ত ত্রুটি কোড সেট
    printf("Error: %s\n", strerror(errno));  // ত্রুটির ব্যাখ্যা প্রদর্শন
    return 0;
}

perror() ফাংশন

perror() ফাংশনটি একটি ব্যাখ্যামূলক ত্রুটি বার্তা প্রদর্শন করে, যেখানে errno সেট করা ত্রুটি কোডের মানের উপর ভিত্তি করে বার্তা দেখানো হয়।

সিঙ্কট্যাক্স:

void perror(const char *s);

উদাহরণ:

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        perror("Error opening file");  // ত্রুটি বার্তা প্রদর্শন
        return 1;
    }

    fclose(file);
    return 0;
}

এখানে, যদি "nonexistent.txt" ফাইলটি বিদ্যমান না থাকে, তবে perror() ত্রুটি বার্তা দেখাবে: **"Error opening file: No such file or directory"**।


সারসংক্ষেপ

errno.h হেডার ফাইলটি সি প্রোগ্রামিংয়ে ত্রুটি পরিচালনার জন্য অপরিহার্য। errno ভেরিয়েবল এবং strerror()perror() ফাংশন ব্যবহার করে প্রোগ্রামের ত্রুটি সম্পর্কে নির্দিষ্ট তথ্য পাওয়া যায়। এটি প্রোগ্রাম ডিবাগ এবং ব্যবহারকারীর জন্য উন্নত ত্রুটি বার্তা প্রদান করতে সহায়ক।

common.content_added_by

perror() এবং strerror() এর মাধ্যমে এরর মেসেজ জেনারেশন

204
204

perror() এবং strerror() এর মাধ্যমে এরর মেসেজ জেনারেশন

সি প্রোগ্রামিং ভাষায়, perror() এবং strerror() ফাংশনগুলো ব্যবহার করে এরর মেসেজ জেনারেট করা যায়। এই ফাংশনগুলো সিস্টেমের ত্রুটি বা সমস্যা সংক্রান্ত বিস্তারিত তথ্য প্রদানে সহায়ক, যেমন ফাইল খোলার সময় ত্রুটি বা মেমোরি বরাদ্দে ত্রুটি ইত্যাদি।

এই ফাংশনগুলোর মধ্যে পার্থক্য হল perror() ত্রুটির সাথে যুক্ত একটি বর্ণনা মুদ্রণ করে, যেখানে strerror() নির্দিষ্ট ত্রুটি কোডের জন্য একটি স্ট্রিং রিটার্ন করে।


১. perror() – এরর মেসেজের সাথে বর্ণনা মুদ্রণ

perror() ফাংশনটি একটি স্ট্রিং ইনপুট নেয় এবং যদি পূর্বে কোনো ত্রুটি ঘটে থাকে (যেমন, সিস্টেম কল ত্রুটি), তবে সেই ত্রুটির বর্ণনা সহ একটি এরর মেসেজ মুদ্রণ করে। এটি স্ট্যান্ডার্ড ত্রুটি আউটপুটে (stderr) ত্রুটির বর্ণনা প্রিন্ট করে।

সিঙ্কট্যাক্স:

void perror(const char *str);
  • str – একটি স্ট্রিং, যা ত্রুটির আগে মুদ্রণ করা হয়। সাধারণত এটি একটি সংক্ষিপ্ত বর্ণনা বা ফাংশন নাম হতে পারে।

উদাহরণ:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");

    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fclose(file);
    return 0;
}

এখানে, fopen() ফাংশনটি যদি nonexistent_file.txt ফাইলটি খোলার সময় ত্রুটি ঘটে, তবে perror() ফাংশনটি ত্রুটির একটি বর্ণনা সহ একটি মেসেজ মুদ্রণ করবে:

Error opening file: No such file or directory

২. strerror() – ত্রুটি কোডের বর্ণনা পাওয়া

strerror() ফাংশনটি একটি ত্রুটি কোড নিয়ে সেই ত্রুটির বর্ণনা হিসেবে একটি স্ট্রিং রিটার্ন করে। এটি সাধারণত errno ভেরিয়েবলের মান দিয়ে কাজ করে, যা সিস্টেম কল বা লাইব্রেরি ফাংশন থেকে সঠিক ত্রুটি কোড ধারণ করে।

সিঙ্কট্যাক্স:

char *strerror(int errnum);
  • errnum – ত্রুটি কোড, যা সাধারণত errno থেকে পাওয়া যায়।

উদাহরণ:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");

    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
        return 1;
    }

    fclose(file);
    return 0;
}

এখানে strerror(errno) ফাংশনটি errno ভেরিয়েবল থেকে ত্রুটি কোড নিয়ে সেই ত্রুটির বর্ণনা হিসেবে একটি স্ট্রিং রিটার্ন করে। যদি fopen() ফাংশনটি কোনো ত্রুটি সৃষ্টি করে, তবে আউটপুট হবে:

Error opening file: No such file or directory

perror() বনাম strerror()

বৈশিষ্ট্যperror()strerror()
কাজত্রুটির বর্ণনা সহ একটি স্ট্রিং আউটপুট করেত্রুটি কোডের জন্য একটি বর্ণনা হিসেবে স্ট্রিং রিটার্ন করে
ইনপুটএকটি স্ট্রিং যা ত্রুটির বর্ণনা প্রদান করেত্রুটি কোড (errno)
আউটপুটস্ট্যান্ডার্ড এরর আউটপুটে মেসেজ মুদ্রণ করেএকটি স্ট্রিং রিটার্ন করে যা ত্রুটির বর্ণনা প্রদান করে
ব্যবহারত্রুটি ঘটে গেলে স্ট্যান্ডার্ড এরর আউটপুটে মেসেজ মুদ্রণ করানির্দিষ্ট ত্রুটি কোডের জন্য একটি বর্ণনা রিটার্ন করা

সারসংক্ষেপ

  • perror(): এটি একটি স্ট্রিং গ্রহণ করে এবং স্ট্যান্ডার্ড এরর আউটপুটে ত্রুটির বর্ণনা সহ একটি মেসেজ মুদ্রণ করে। এটি সাধারনত সিস্টেম কলের পর ত্রুটি ঘটলে ব্যবহার করা হয়।
  • strerror(): এটি একটি ত্রুটি কোড (errno) নিয়ে ত্রুটির বর্ণনা হিসেবে একটি স্ট্রিং রিটার্ন করে। এটি সাধারণত ত্রুটি কোডগুলি প্রসেস করার সময় ব্যবহার করা হয়।

এই দুটি ফাংশনই সি প্রোগ্রামিংয়ে ত্রুটি ম্যানেজমেন্টে সহায়ক, বিশেষত যখন আপনি সিস্টেম কলগুলোর মাধ্যমে ত্রুটি পেতে চান এবং সেই ত্রুটির সঠিক বর্ণনা পেতে চান।

common.content_added_by

Error Code এবং Return Value চেকিং

262
262

Error Code এবং Return Value চেকিং

সি প্রোগ্রামিং ভাষায় error code এবং return value চেকিং একটি গুরুত্বপূর্ণ প্র্যাকটিস, যা প্রোগ্রাম চলাকালীন সম্ভাব্য ভুল বা ত্রুটি সনাক্ত করতে সাহায্য করে। বিভিন্ন সি ফাংশন return value অথবা error code রিটার্ন করে, যা ব্যবহারের সময় ত্রুটির অবস্থাকে চিহ্নিত করতে ব্যবহৃত হয়। সঠিক error handling কোডের স্থিতিশীলতা নিশ্চিত করে এবং অপ্রত্যাশিত আচরণ বা ক্র্যাশ এড়ায়।

Error Code এবং Return Value চেকিং - Overview

  • Return Value: কোনো ফাংশন যখন কাজ সম্পন্ন করে, তখন সেটি একটি মান রিটার্ন করতে পারে, যা প্রোগ্রামারকে জানাতে পারে যে, ফাংশনটি সফলভাবে কাজ করেছে কি না।
  • Error Code: অনেক সি ফাংশন এমন error code রিটার্ন করে, যা ত্রুটির ধরন চিহ্নিত করতে সাহায্য করে। যেমন, errno ভেরিয়েবলটি সিস্টেম কলের ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়।

১. Return Value চেকিং

ফাংশন যখন একটি মান রিটার্ন করে, তখন এই রিটার্ন মানটি চেক করা গুরুত্বপূর্ণ, বিশেষত যখন ফাংশনের সফলতা বা ব্যর্থতা নির্ভর করে সেই মানের উপর। উদাহরণস্বরূপ, fopen() ফাংশনটি ফাইল খুলতে ব্যবহৃত হয় এবং এটি সফল হলে একটি ফাইল পয়েন্টার রিটার্ন করে, কিন্তু যদি ফাইলটি না খোলা যায়, এটি NULL রিটার্ন করে।

উদাহরণ: fopen() এর Return Value চেক করা

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("Error: Unable to open file.\n");
        return 1;  // ফাইল খোলার ক্ষেত্রে ত্রুটি
    }

    printf("File opened successfully.\n");
    fclose(file);  // ফাইল বন্ধ করা
    return 0;
}

এখানে fopen() ফাংশনের রিটার্ন ভ্যালু NULL চেক করা হয়েছে। যদি NULL রিটার্ন হয়, তাহলে এটি ফাইল খোলার ত্রুটি নির্দেশ করে এবং প্রোগ্রামটি বন্ধ হয়ে যায়।


২. Error Code চেকিং

অনেক সি ফাংশন error code রিটার্ন করে, বিশেষত সিস্টেম কলের ক্ষেত্রে। উদাহরণস্বরূপ, malloc() ফাংশনটি যখন মেমোরি বরাদ্দে ব্যর্থ হয়, তখন এটি NULL রিটার্ন করে। এছাড়াও, errno ভেরিয়েবলটি সিস্টেম কলের ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়, এবং এর মান বিভিন্ন ত্রুটির কোডের মাধ্যমে ব্যাখ্যা করা যায়।

উদাহরণ: malloc() Error Code চেক করা

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(100 * sizeof(int));

    if (ptr == NULL) {
        printf("Error: Memory allocation failed.\n");
        return 1;  // মেমোরি বরাদ্দে ত্রুটি
    }

    printf("Memory allocated successfully.\n");
    free(ptr);  // মেমোরি মুক্ত করা
    return 0;
}

এখানে malloc() এর রিটার্ন ভ্যালু চেক করা হয়েছে, যদি এটি NULL রিটার্ন করে, তাহলে "Memory allocation failed" বার্তা প্রদর্শন করা হয়।


৩. errno এবং এর ব্যবহারের উদাহরণ

সি প্রোগ্রামে যখন সিস্টেম কল বা স্ট্যান্ডার্ড লাইব্রেরি ফাংশন একটি ত্রুটি ঘটায়, তখন errno ভেরিয়েবল সেট করা হয়, যা ত্রুটির ধরন নির্দেশ করে। errno ভেরিয়েবলটি <errno.h> হেডার ফাইলে ডিফাইন করা থাকে।

উদাহরণ: errno চেক করা

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");

    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));  // strerror() ব্যবহার করে ত্রুটির বর্ণনা
        return 1;
    }

    fclose(file);
    return 0;
}

এখানে, fopen() যদি ফাইল না খুলতে পারে, তখন errno সেট হয়ে strerror() ফাংশনের মাধ্যমে ত্রুটির বর্ণনা প্রদর্শিত হয়।

errno এর কিছু সাধারণ ত্রুটি কোড:

  • ENOENT: ফাইল বা ডিরেক্টরি খুঁজে পাওয়া যায়নি।
  • ENOMEM: মেমোরি বরাদ্দে ব্যর্থতা।
  • EIO: ইনপুট/আউটপুট ত্রুটি।
  • EINVAL: অবৈধ আর্গুমেন্ট।

৪. কন্ডিশনাল চেকিং এবং Return Value Error Handling

প্রায় সব সিস্টেম কল এবং লাইব্রেরি ফাংশন একটি নির্দিষ্ট রিটার্ন ভ্যালু প্রদান করে, যার মাধ্যমে প্রোগ্রামার সঠিকভাবে ত্রুটি চেক করতে পারেন। কিছু ফাংশনের ক্ষেত্রে ত্রুটি ঘটলে -1 বা NULL রিটার্ন করা হয়, এবং সফল হলে অন্য কোন মান রিটার্ন করা হয়। এই রিটার্ন ভ্যালু চেক করার মাধ্যমে আপনি ত্রুটি পরিচালনা করতে পারবেন।

উদাহরণ: close() এর Return Value চেক

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int file_desc = open("example.txt", O_RDONLY);

    if (file_desc == -1) {
        printf("Error opening file.\n");
        return 1;  // ফাইল ওপেন করতে ব্যর্থ
    }

    // ফাইল বন্ধ করার সময় ত্রুটি চেক করা
    if (close(file_desc) == -1) {
        printf("Error closing file.\n");
        return 1;  // ফাইল বন্ধ করতে ব্যর্থ
    }

    printf("File closed successfully.\n");
    return 0;
}

এখানে, open() এবং close() ফাংশনের রিটার্ন ভ্যালু চেক করা হয়েছে। -1 রিটার্ন হলে এটি ত্রুটি নির্দেশ করে।


সারসংক্ষেপ

  • Return Value চেকিং: যেকোনো ফাংশনের রিটার্ন ভ্যালু চেক করা উচিত, যাতে সফলতা বা ব্যর্থতা সনাক্ত করা যায়। যেমন, fopen() বা malloc() এর রিটার্ন ভ্যালু চেক করে, আপনি ত্রুটি হ্যান্ডলিং করতে পারেন।
  • Error Code চেকিং: সিস্টেম কল বা লাইব্রেরি ফাংশন errno এর মাধ্যমে ত্রুটির ধরন নির্ধারণ করে। strerror() ফাংশনটি errno এর মান ব্যাখ্যা করতে ব্যবহৃত হয়।
  • -1 বা NULL চেকিং: সিস্টেম কল এবং লাইব্রেরি ফাংশনগুলো -1 বা NULL রিটার্ন করলে এটি ত্রুটি নির্দেশ করে।
common.content_added_by

C প্রোগ্রামিং এ Exception Handling Techniques

224
224

C প্রোগ্রামিং এ Exception Handling Techniques

সি প্রোগ্রামিং ভাষায় Exception Handling বা অসতর্ক অবস্থা হ্যান্ডলিং সরাসরি কোন বিল্ট-ইন ফিচারের মাধ্যমে সরবরাহ করা হয় না, যেমন অন্যান্য ভাষায় (যেমন C++, Java)। তবে, সি প্রোগ্রামিংয়ে এক্সসেপশন হ্যান্ডলিং হ্যান্ডল করার জন্য কিছু কৌশল এবং ট্রিক্স ব্যবহার করা হয়, যা ভুল বা অসতর্ক অবস্থা (runtime error) এ প্রতিক্রিয়া জানাতে সাহায্য করে।

সি ভাষায় সাধারণত error handling করা হয় বিভিন্ন return values, error codes, assertions, এবং setjmp()/longjmp() ফাংশন ব্যবহারের মাধ্যমে।


১. Return Values এবং Error Codes এর মাধ্যমে Error Handling

সি ভাষায় ফাংশনগুলো সাধারণত ইনপুট/আউটপুট, মেমোরি অ্যাক্সেস, ফাইল ওপেন ইত্যাদি অপারেশন সম্পাদনের সময় error codes রিটার্ন করে, যা থেকে প্রোগ্রামার বুঝতে পারেন যে কোনো সমস্যা ঘটেছে।

উদাহরণ: ফাইল ওপেনের সময় error handling

#include <stdio.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");

    // চেক করা যে ফাইল ওপেন সফল হয়েছে কিনা
    if (file == NULL) {
        printf("Error opening file. Exiting program...\n");
        return 1;  // Error code রিটার্ন
    }

    // ফাইল কাজ সম্পন্ন করার পর বন্ধ করা
    fclose(file);
    return 0;
}

এখানে, fopen() যদি ফাইল ওপেন করতে ব্যর্থ হয় তবে এটি NULL রিটার্ন করবে, এবং প্রোগ্রাম একটি error message প্রদর্শন করবে এবং বের হয়ে যাবে।


২. assert() ব্যবহার করে Error Checking

assert() একটি ম্যাক্রো যা একটি শর্ত যাচাই করে এবং সেই শর্তটি যদি সত্য না হয় তবে প্রোগ্রামটি ক্র্যাশ হয়ে যায়। এটি সাধারণত ডিবাগিং এর সময় ব্যবহার করা হয়, কিন্তু runtime error হ্যান্ডলিংয়ের জন্য এটি কিছুটা সহায়ক হতে পারে।

উদাহরণ:

#include <stdio.h>
#include <assert.h>

int divide(int a, int b) {
    assert(b != 0);  // নিশ্চিত করা যে, b শূন্য নয়
    return a / b;
}

int main() {
    int result = divide(10, 0);  // ভুল ইনপুট দেওয়া হয়েছে
    printf("Result: %d\n", result);
    return 0;
}

এখানে, assert(b != 0) নিশ্চিত করবে যে b শূন্য নয়। যদি b == 0 হয়, তবে প্রোগ্রামটি চলাকালীন একটি ত্রুটি দেখাবে এবং প্রোগ্রামটি বন্ধ হবে।


৩. setjmp() এবং longjmp() ব্যবহার করে Error Handling

সি ভাষায় setjmp() এবং longjmp() ফাংশন দুটি ব্যবহার করে আপনি একটি ফাংশনের মধ্যে exception handling করতে পারেন। setjmp() ফাংশন একটি পয়েন্ট (checkpoint) সেট করে, এবং longjmp() ফাংশনটি সেই পয়েন্টে চলে আসে, এটি কার্যকরভাবে exception-handling এর মতো কাজ করে।

সিঙ্কট্যাক্স:

#include <setjmp.h>

jmp_buf env;  // Declare a buffer to store the environment

int main() {
    int val = setjmp(env);  // setjmp sets the environment and returns 0 initially

    if (val != 0) {
        // If we come here after calling longjmp, then it's an error condition
        printf("Error occurred: %d\n", val);
        return 1;
    } else {
        // Normal program flow
        // Simulating an error
        longjmp(env, 1);  // Simulate an error by jumping back to setjmp
    }

    return 0;
}

ব্যাখ্যা:

  • setjmp(env): এটি চেকপয়েন্ট তৈরি করে এবং 0 রিটার্ন করে।
  • longjmp(env, 1): এটি setjmp()-এ ফিরে যায় এবং 1 রিটার্ন করে, যা একটি ত্রুটি (exception) হিসাবে চিহ্নিত হয়।

এটি সি প্রোগ্রামে exception handling এ একটি কাজের মেকানিজম হতে পারে, তবে এটি কিছুটা ঝুঁকিপূর্ণ এবং সঠিকভাবে ব্যবহৃত না হলে প্রোগ্রামের স্টেট ম্যানেজমেন্টে সমস্যা তৈরি করতে পারে।


৪. Error Handling with errno

errno একটি গ্লোবাল ভেরিয়েবল যা সিস্টেম কল বা লাইব্রেরি ফাংশনগুলির সাথে সম্পর্কিত ত্রুটির কোড ধারণ করে। যখন কোনো সিস্টেম কল বা লাইব্রেরি ফাংশন ত্রুটি ঘটায়, তখন তা errno সেট করে, এবং প্রোগ্রামার সেই ত্রুটির ধরন চিহ্নিত করতে perror() বা strerror() ফাংশন ব্যবহার করতে পারেন।

উদাহরণ:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");

    if (file == NULL) {
        // `errno` এবং `perror()` এর মাধ্যমে ত্রুটি প্রদর্শন
        perror("Error opening file");
        printf("Error number: %d\n", errno);
        return 1;
    }

    fclose(file);
    return 0;
}

এখানে perror() ফাংশনটি errno ভেরিয়েবলের মানের মাধ্যমে একটি ত্রুটি বার্তা প্রদর্শন করে।


সারসংক্ষেপ:

পদ্ধতিবর্ণনা
return valuesফাংশনের মাধ্যমে error code রিটার্ন করে ত্রুটি শনাক্ত করা।
assert()নির্দিষ্ট শর্ত যাচাই করার জন্য ব্যবহৃত, ডিবাগিং এর সময়।
setjmp()/longjmp()এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহার করা হয়।
errnoসিস্টেম কল বা লাইব্রেরি ফাংশন দ্বারা রিটার্ন করা ত্রুটি কোড।

সি প্রোগ্রামিং ভাষায় Exception Handling সরাসরি সমর্থিত না হলেও, return values, setjmp()/longjmp(), errno এবং assert() এর মাধ্যমে ত্রুটি শনাক্তকরণ এবং হ্যান্ডলিং করা সম্ভব।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion